package com.xb.cloud.gateway.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.xb.cloud.configcenter.DBConfigLoader;
import com.xb.cloud.gateway.core.engine.XBEngineImpl;
/**
 * 
 * @ClassName:  GatewayServlet   
 * 鲜备主servlet
 * 处理流程如下
 * 第一步初始化：
 * 			1.本servlet初始化时 获取spring容器中注入的 无线服务引擎（当前仅有一个服务引擎接口实现类实例）
 * 			2.通过服务引擎(XBEngineImpl)的初始化方法调用dispatcher.init()完成适配器装配（读取spring容器注入的adapter实例）
 *            Map<String, Adapter> adapterMap （静态常量）
 * 第二步提供服务：
 *          1.通过服务引擎的service方法，根据request的uri匹配具体的适配器（dispatcher.getAdapter(urlPath)）；
 *            找不到适配器 直接报错
 *          2.创建上下文对象，并根据请求参数信息完成初始化
 *          3.重构上线文对象，基于reqeust.getParameterNames得到bizPara对象
 *                           基于request.getHeaderNames   得到（userToken、provinceId、clientInfo对象）
 *            最终得到包装后的上线文对象：context.setRequestInfo(new RequestInfo(clientInfo, userToken, provinceId, bizPara))
 *                                      context.setRequestIp(context.getHttpRequest().getRemoteAddr())
 * @author: 鲜备科技
 * @date:   2017年12月18日 下午3:53:10   
 *     
 * @Copyright: 2017 www.xianbeitech.com Inc. All rights reserved. 
 *
 */
public class GatewayServlet extends HttpServlet {
	/**   
	 * @Fields serialVersionUID : TODO
	 */ 
	private static final long serialVersionUID = 1L;
	/**
	 * 鲜备网关主引擎
	 */
	private XBEngineImpl xbEngine;
	/**
	 * 
	 * <p>Title: init</p>   
	 * <p>Description: 实现sevlet 初始化方法 （通过主引擎实现）</p>   
	 * @throws ServletException   
	 * @see javax.servlet.GenericServlet#init()
	 */
	public void init() throws ServletException {
		super.init();
		WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext (getServletContext());
		xbEngine = (XBEngineImpl)wac.getBean ("xbEngineImpl");
		xbEngine.init();
		
		DBConfigLoader dbConfigLoader = (DBConfigLoader)wac.getBean ("DBConfigLoader");
		dbConfigLoader.load();
	}
	
	
	/**
	 * 
	 * <p>Title: service</p>   
	 * <p>Description:实现servlet 服务方法 （通过主引擎服务实现） </p>   
	 * @param req
	 * @param resp
	 * @throws ServletException
	 * @throws IOException   
	 * @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	 */
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		xbEngine.execute (req, resp);
    }

	
	
}
